package sv.gob.mtps.sib.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import sv.gob.mtps.sib.model.Bodega;
import sv.gob.mtps.sib.model.InventarioPedidoVw;
import sv.gob.mtps.sib.model.PedidoHasProducto;
import sv.gob.mtps.sib.model.Fuentefondo;
import sv.gob.mtps.sib.model.Inventario;
import sv.gob.mtps.sib.model.InventarioHasTransacciones;
import sv.gob.mtps.sib.model.Objetoespecifico;
import sv.gob.mtps.sib.model.Pedido;
import sv.gob.mtps.sib.model.PedidoMastVw;
import sv.gob.mtps.sib.model.PedidosDetVw;
import sv.gob.mtps.sib.model.ProductoHasObjetoespecifico;
import sv.gob.mtps.sib.model.SeccionUnidadVw;
import sv.gob.mtps.sib.model.Transaccion;

@Repository
public class PedidoDAOImpl implements PedidoDAO{
	
	@Autowired
    private SessionFactory sessionFactory;

	@Override
	public void addPedido(Pedido pedido) {
		sessionFactory.getCurrentSession().save(pedido);		
	}

	@Override
	public List<Pedido> listPedido() {
		return sessionFactory.getCurrentSession().createQuery("from Pedido").list();
	}

	@Override
	public void removePedido(Integer id) {
		Pedido pedido = (Pedido)sessionFactory.getCurrentSession().load(Pedido.class, id);
		if(pedido != null){
			sessionFactory.getCurrentSession().delete(pedido);
		}		
	}

	@Override
	public Pedido findPedido(Integer id) {
		return (Pedido)sessionFactory.getCurrentSession().get(Pedido.class, id);
	}
	
	@Override
	public void updatePedido(Pedido pedido) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().update(pedido);
	}
	
	/*se Agregan los metodos para 
	 * el ingreso del detalle 
	 * de la factura*/

	@Override
	public void addPedidoDet(PedidoHasProducto pedidoDet) {
		sessionFactory.getCurrentSession().save(pedidoDet);			
	}

	

	@Override
	public void removePedidoDet(Integer id) {
		// TODO Auto-generated method stub
		PedidoHasProducto fact = (PedidoHasProducto) sessionFactory.getCurrentSession().load(PedidoHasProducto.class, id);
		if(fact != null){
			sessionFactory.getCurrentSession().delete(fact);
		}
		
		
	}

	@Override
	public PedidoHasProducto findPedidoDet(Integer id) {
		// TODO Auto-generated method stub
		return (PedidoHasProducto) sessionFactory.getCurrentSession().get(PedidoHasProducto.class, id);
	}

	

	@Override
	public void updatePedidoDet(PedidoHasProducto pedidoDet) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().update(pedidoDet);
	}

	@Override
	public List<PedidoHasProducto> listPedidoDet(Integer id) {
		// TODO Auto-generated method stub
		String hql = "from PedidoHasProducto f where f.pedido.idPedido = " + id;		
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	@Override
	public List<Objetoespecifico> listObjeto() {
		// TODO Auto-generated method stub
		return sessionFactory.getCurrentSession().createQuery("from ProductoHasObjetoespecifico").list();
	}
	
	/*se agrega metodo para 
	 * la busqueda de Bodegas*/

	@Override
	public List<Bodega> listBodega() {
		// TODO Auto-generated method stub
		String hql = "from Bodega";
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}
	
	 /*Busqueda de inventario por bodega,fuente
     *  de fondo y producto_objetoespecifico
     */    

	@Override
	public List<Inventario> listInvent(int bodega, int fuenteFondo,
			int producto_objeto) {
		// TODO Auto-generated method stub
		String sql = "from Inventario i where i.bodega.idBodega = "+bodega +
				" and i.fuentefondo.idFuentefondo = " + fuenteFondo + 
				" and i.productoHasObjetoespecifico.idProductoHasObjetoespecifico = "+producto_objeto;
		return sessionFactory.getCurrentSession().createQuery(sql).list();
	}

	
	/*se agrega el inventario*/
	@Override
	public void addInventario(Inventario inv) {
		// TODO Auto-generated method stub
		
		sessionFactory.getCurrentSession().save(inv);
	}

	@Override
	public Bodega findBodega(int id) {
		// TODO Auto-generated method stub		
		return (Bodega) sessionFactory.getCurrentSession().get(Bodega.class, id);
	}

	@Override
	public ProductoHasObjetoespecifico findPrdObj(int id) {
		// TODO Auto-generated method stub
		return (ProductoHasObjetoespecifico) sessionFactory.getCurrentSession().get(ProductoHasObjetoespecifico.class, id);
	}

	@Override
	public void addTransaccion(InventarioHasTransacciones transact) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().save(transact);
		
	}

	@Override
	public List<PedidoHasProducto> listPedidoDet(Integer id, Integer idProObj) {
		// TODO Auto-generated method stub
		 String hql = "from PedidoHasProducto where pedido.idPedido = " +id + " and inventario.idInventario = "+idProObj;			
		 return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	@Override
	public Transaccion findTransaccion(int id) {
		// TODO Auto-generated method stub
		return (Transaccion) sessionFactory.getCurrentSession().get(Transaccion.class, id);
	}

	@Override
	public void updateInventario(Inventario inv) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().update(inv);
	}

	@Override
	public List<InventarioHasTransacciones> listTransacciones(int documentoPadre,int hijo,int tipoTran) {
		// TODO Auto-generated method stub
		String hql = "from InventarioHasTransacciones iv where iv.idDocumentoPadre = " +documentoPadre + " and iv.numeroDocumento =" +hijo + "  and iv.transaccion.idTransaccion=" + tipoTran;
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	@Override
	public List<InventarioPedidoVw> listInvent() {
		// TODO Auto-generated method stub
		String hql = "from InventarioPedidoVw ";
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	@Override
	public List<SeccionUnidadVw> listSeccionUnidad() {
		// TODO Auto-generated method stub
		String hql = "from SeccionUnidadVw";
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	@Override
	public List<PedidoMastVw> listPedidosMas() {
		// TODO Auto-generated method stub
		return sessionFactory.getCurrentSession().createQuery("from PedidoMastVw order by id.idPedido desc").list();
	}

	@Override
	public List<PedidosDetVw> listPedidosDet(int id) {
		// TODO Auto-generated method stub
		return sessionFactory.getCurrentSession().createQuery("from PedidosDetVw where id.idPedido=" + id + " order by id.idPedidoHasProducto desc").list();
	}

	@Override
	public Inventario findInventario(int id) {
		// TODO Auto-generated method stub
		return (Inventario) sessionFactory.getCurrentSession().get(Inventario.class, id);
	}


}
